import argparse
import pandas as pd
from datetime import datetime

def calculate_stop_loss_percentage(leverage, capital_percentage=100, total_loss_percentage=10):
    """
    计算部分本金开全仓杠杆交易的止损点
    
    参数:
    leverage (float): 杠杆倍数
    capital_percentage (float): 用于交易的本金百分比，默认为100%（全部本金）
    total_loss_percentage (float): 允许的总本金损失百分比，默认为10%
    
    返回:
    float: 止损价格变动的百分比
    """
    # 计算实际投入的本金比例
    actual_capital_percentage = capital_percentage / 100
    
    # 计算允许的最大亏损（相对于总本金）
    max_loss_percentage = total_loss_percentage / 100
    
    # 计算允许的交易亏损（相对于投入的部分本金）
    capital_loss_ratio = max_loss_percentage / actual_capital_percentage
    
    # 由于杠杆，价格变动导致的亏损放大 leverage 倍
    price_change_percentage = capital_loss_ratio * 100 / leverage
    
    return price_change_percentage

def calculate_profit_percentage(leverage, capital_percentage, price_change_percentage):
    """
    计算给定价格变动时的总资金盈利百分比
    
    参数:
    leverage (float): 杠杆倍数
    capital_percentage (float): 用于交易的本金百分比
    price_change_percentage (float): 价格变动百分比
    
    返回:
    float: 总资金的盈利百分比
    """
    # 计算实际投入的本金比例
    actual_capital_percentage = capital_percentage / 100
    
    # 计算投入资金的盈利比例（杠杆放大后）
    position_profit_ratio = price_change_percentage * leverage / 100
    
    # 转换为总资金的盈利比例
    total_profit_percentage = position_profit_ratio * actual_capital_percentage * 100
    
    return total_profit_percentage

def create_excel_report(args):
    """
    创建详细的Excel报告
    """
    # 常见杠杆倍数
    leverages = [1, 2, 3, 5, 8, 10, 20, 30, 50, 100, 125]
    # 常见本金使用比例
    capital_percentages = [100, 75, 50, 30, 25, 10, 5]
    
    # 创建数据列表
    data = []
    for capital_percentage in capital_percentages:
        for leverage in leverages:
            # 计算总资金盈利百分比
            profit = calculate_profit_percentage(leverage, capital_percentage, args.price_change)
            
            # 计算止损价格百分比
            stop_loss = calculate_stop_loss_percentage(leverage, capital_percentage, args.total_loss)
            
            # 计算风险回报比
            risk_reward_ratio = args.price_change / stop_loss
            
            # 添加数据
            data.append({
                '本金使用比例': f"{capital_percentage}%",
                '杠杆倍数': f"{leverage}x",
                '总资金盈利': f"{profit:.2f}%",
                '止损价格': f"{stop_loss:.2f}%",
                '风险回报比': f"1:{risk_reward_ratio:.2f}",
                '投入金额': f"{capital_percentage/100:.2%}",
                '杠杆后名义价值': f"{capital_percentage/100*leverage:.2f}x",
                '单位风险收益': f"{profit/stop_loss:.2f}"
            })
    
    # 创建DataFrame
    df = pd.DataFrame(data)
    
    # 创建Excel文件
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    filename = f'trading_analysis_{timestamp}.xlsx'
    
    # 创建Excel writer对象
    with pd.ExcelWriter(filename, engine='openpyxl') as writer:
        # 写入主数据表
        df.to_excel(writer, sheet_name='详细数据', index=False)
        
        # 创建数据透视表
        pivot_profit = pd.pivot_table(df, 
                                    values='总资金盈利', 
                                    index='本金使用比例',
                                    columns='杠杆倍数',
                                    aggfunc='first')
        pivot_profit.to_excel(writer, sheet_name='盈利透视表')
        
        pivot_risk = pd.pivot_table(df, 
                                  values='止损价格', 
                                  index='本金使用比例',
                                  columns='杠杆倍数',
                                  aggfunc='first')
        pivot_risk.to_excel(writer, sheet_name='止损透视表')
        
        # 添加参数说明
        params_df = pd.DataFrame([
            ['止盈价格', f"{args.price_change}%"],
            ['总本金损失限制', f"{args.total_loss}%"],
            ['生成时间', datetime.now().strftime('%Y-%m-%d %H:%M:%S')]
        ], columns=['参数', '值'])
        params_df.to_excel(writer, sheet_name='参数说明', index=False)
    
    return filename

def main():
    parser = argparse.ArgumentParser(description='计算杠杆交易的盈亏情况并导出Excel报告')
    parser.add_argument('-l', '--leverage', type=float, default=0, help='指定杠杆倍数')
    parser.add_argument('-c', '--capital-percentage', type=float, default=100,
                        help='用于交易的本金百分比，默认为100%%（全部本金）')
    parser.add_argument('-t', '--total-loss', type=float, default=10,
                        help='允许的总本金损失百分比，默认为10%%')
    parser.add_argument('-p', '--price-change', type=float, default=2,
                        help='价格变动百分比，默认为2%%')
    parser.add_argument('--table', action='store_true', help='显示不同参数组合的表格')
    parser.add_argument('--excel', action='store_true', help='不生成Excel文件')
    
    args = parser.parse_args()
    
    # 如果指定了杠杆倍数，显示具体计算结果
    if args.leverage > 0:
        stop_loss = calculate_stop_loss_percentage(args.leverage, args.capital_percentage, args.total_loss)
        profit = calculate_profit_percentage(args.leverage, args.capital_percentage, args.price_change)
        
        print(f"\n使用本金的 {args.capital_percentage}% 开 {args.leverage}倍杠杆")
        print(f"当价格上涨 {args.price_change}% 时，总资金盈利: {profit:.2f}%")
        print(f"限制总本金损失 {args.total_loss}% 时，止损价格变动百分比: {stop_loss:.4f}%")
        
        # 计算风险回报比
        risk_reward_ratio = args.price_change / stop_loss
        print(f"风险回报比: 1:{risk_reward_ratio:.2f}\n")
        
     # 显示不同参数组合的表格
    if args.table or args.leverage <= 0:
        # 常见杠杆倍数
        leverages = [2, 5, 8, 10, 20, 30, 50,70, 100, 125,200]
        # 常见本金使用比例
        # capital_percentages = [100,50,45,30, 25,20, 10, 5]
        capital_percentages = [50,45,30, 25,20, 10,5,1]

        # 固定止盈价格变动百分比
        fixed_price_change = args.price_change

        print(f"限制总本金损失 {args.total_loss}% 时")
        print(f"固定止盈价格变动{fixed_price_change}%时的盈利情况：")
        print("本金使用比例 | 杠杆倍数 | 总资金盈利% | 止损价格% | 风险回报比")
        print("-" * 70)

        for capital_percentage in capital_percentages:
            for leverage in leverages:
                # 计算总资金盈利百分比
                profit = calculate_profit_percentage(leverage, capital_percentage, fixed_price_change)

                # 计算止损价格百分比
                stop_loss = calculate_stop_loss_percentage(leverage, capital_percentage, args.total_loss)

                # 计算风险回报比
                risk_reward_ratio = fixed_price_change / stop_loss

                print(f"{capital_percentage:12.1f}% | {leverage:8d}x | {profit:9.2f}% | {stop_loss:8.2f}% | 1:{risk_reward_ratio:6.2f}")

            # 在不同本金使用比例之间添加分隔线
            if capital_percentage != capital_percentages[-1]:
                print("-" * 70)
    # 生成Excel报告
    if args.excel:
        try:
            filename = create_excel_report(args)
            print(f"\nExcel报告已生成: {filename}")
            print("报告包含以下sheet:")
            print("1. 详细数据 - 所有参数组合的完整数据")
            print("2. 盈利透视表 - 不同本金比例和杠杆倍数的盈利矩阵")
            print("3. 止损透视表 - 不同本金比例和杠杆倍数的止损矩阵")
            print("4. 参数说明 - 计算使用的关键参数\n")
        except Exception as e:
            print(f"\n生成Excel报告时出错: {str(e)}")
            print("请确保已安装pandas和openpyxl库:")
            print("pip install pandas openpyxl\n")

if __name__ == "__main__":
    main()